// 知识点1：operator new和operator
// delete和alloctor类的allocate和deallocate很像，都是负责分配和释放内存的函数，但是对于operator
// new分配的内存空间我们无法使用construct函数构造对象，我们应该使用new的定位new形式构造对象

// 知识点2：当只传入一个指针类型的实参时，定位new表达式构造对象但是不分配内存，这个指针没有要求，甚至可能是一个不是一个指向动态内存的指针

// 知识点3：调用析构函数会销毁对象，但是不会释放内存

// 知识点4：运行时类型识别（RTTI），typeid：用于返回表达式的类型，dynamic_cast：用于将基类的指针或引用转换成派生类的指针或引用，当我们将这两个运算符用于某种类型的引用或指针时，并且该类型含有虚函数，运算符将会使用指针或引用所绑定对象的动态类型

// 知识点5：RTTI使用情况：使用基类的指针或引用调用派生类的操作并且该操作不是虚函数，一般来说，我们应该尽量将其定义为虚函数（最好是定义为虚函数），编译器会根据对象的动态类型自动选择正确版本的函数

// 知识点6：三种形式：dynamic_cast<type *> (e)、dynamic_cast<type &>
// (e)、dynamic_cast<type &&> (e)

// type的类型必须含有虚函数，e分别为指针、左值、除了左值以外的类型，e需要满足的条件：目标type的共有派生类、目标type的共有基类或者就是目标type类型，转换失败时，指针类型返回0，引用类型转换失败抛出bad_cast异常，头文件为typeinfo

// 知识点7：可以对空指针进行dynamic_cast，结果是所需的空指针，在条件部分执行dynamic_cast可以确保类型转换和检查结果在同一条表达式中完成！

// 这里基类的指针或引用转化称为派生类的指针或者引用，需要注意的是该基类的指针需要指向的是派生类的对象才可以，否则指向基类对象的基类指针或引用是不可能转化为派生类的指针或引用的
/***************************************************************************
 *  @file       main.cpp
 *  @author     MISAYAONE
 *  @date       21  March 2017
 *  @remark     21  March 2017
 ***************************************************************************/
